# -*- coding: utf-8 -*-
#
# File: Ata.py
#
# Copyright (c) 2006 by IBICT
# Generator: ArchGenXML Version 1.5.0
#            http://plone.org/products/archgenxml
#
# GNU General Public License (GPL)
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301, USA.
#

__author__ = """IBICT <cadu@ibict.br>"""
__docformat__ = 'plaintext'

from AccessControl import ClassSecurityInfo
from Products.Archetypes.atapi import *
from Products.Archetypes.SQLStorage import *
from Products.SIGFS.config import *

# additional imports from tagged value 'import'
from Acquisition import aq_parent, aq_inner
from Products.DataGridField.DataGridField import DataGridField
from Products.DataGridField.DataGridWidget import DataGridWidget
from Products.DataGridField.SelectColumn import SelectColumn
from Products.DataGridField.Column import Column

##code-section module-header #fill in your manual code here
from Products.Archetypes import transaction
from Products.Archetypes.public import DisplayList
##/code-section module-header

schema = Schema((

    DateTimeField(
        name='prazo_pendencia_ata',
        default="DateTime()",
        serchable="1",
        required=1,
        widget=CalendarWidget(
            label="Prazo de pendência",
            description="Informe a data durante a qual os revisores poderão inserir comentários sobre a Ata, antes de publicá-la.",
            format="%d/%m/%Y",
            date_only="1",
            show_hm=False,
            label_msgid='SIGFS_label_prazo_pendencia_ata',
            description_msgid='SIGFS_help_prazo_pendencia_ata',
            i18n_domain='SIGFS',
        )
    ),

    TextField(
        name='andamento',
        allowable_content_types=('text/plain', 'text/structured', 'text/html', 'application/msword',),
        serchable="1",
        default_output_type='text/html',
        widget=RichWidget(
            label="Andamento da Reunião",
            description="Informe o texto de andamento da Reunião, descrevendo o que foi tratado na Reunião.",
            label_msgid='SIGFS_label_andamento',
            description_msgid='SIGFS_help_andamento',
            i18n_domain='SIGFS',
        ),
        required=1
    ),

    LinesField(
        name='convocados_reuniao',
        serchable="1",
        schemata="Participantes",
        widget=MultiSelectionWidget(
            label="Convocados para a Reunião",
            description="Os membros aqui apresentados foram convocados para a Reunião, se o membro compareceu à Reunião o campo à direita do seu nome deve ser selecionado.",
            format="checkbox",
            label_msgid='SIGFS_label_convocados_reuniao',
            description_msgid='SIGFS_help_convocados_reuniao',
            i18n_domain='SIGFS',
        ),
        vocabulary='listConvocadosReuniao'
    ),

    DataGridField(
        name='convidados_reuniao',
        serchable="1",
        schemata="Participantes",
        widget=DataGridWidget(
            label="Convidados e Técnicos",
            description="Os membros aqui informados foram os técnicos e convidados para a Reunião, especifique quais compareceram e quais funções desempenharam na mesma.",
            columns={'nome': SelectColumn('Nome', 'listConvidadosReuniao'), 'presenca': SelectColumn('Presença', 'listJustificou'),'cargo': SelectColumn('Cargo', 'listCargo'),'orgao': Column('Órgão ou Classe')},
            label_msgid='SIGFS_label_convidados_reuniao',
            description_msgid='SIGFS_help_convidados_reuniao',
            i18n_domain='SIGFS',
        ),
        columns=('nome','presenca','cargo','orgao')
    ),

),
)

##code-section after-local-schema #fill in your manual code here
##/code-section after-local-schema

Ata_schema = BaseBTreeFolderSchema.copy() + \
    schema.copy()

##code-section after-schema #fill in your manual code here
##/code-section after-schema

class Ata(BaseBTreeFolder):
    """
    """
    security = ClassSecurityInfo()
    __implements__ = (getattr(BaseBTreeFolder,'__implements__',()),)

    # This name appears in the 'add' box
    archetype_name = 'Ata da Reunião'

    meta_type = 'Ata'
    portal_type = 'Ata'
    allowed_content_types = ['Resolucao', 'AtaReservada', 'File']
    filter_content_types = 1
    global_allow = 0
    content_icon = 'paste_icon.gif'
    immediate_view = 'base_view'
    default_view = 'ata_view'
    suppl_views = ()
    typeDescription = "Ata gerada a partir da Reunião realizada. Na Ata estarão identificados os membros que participaram, ou justificaram sua ausência na Reunião. Antes de ser publicada, será enviado um email para os convocados que compareceram à Reunião para que revisem a Ata e ela seja publicada. A Ata só não poderá ser publicada se a Reunião ainda não estiver publicada ou se não houver nenhuma Resolução relacionada a ela. Se houver Resoluções e Atividades já relacionadas à Ata e esta ainda estiver privada, as Atividades e Resoluções devem estar pendentes de revisão. Somente assim a Ata será publicada. Na Ata podem ser adicionados anexos, para isto clique no link 'Adicionar novo item' e escolha 'Arquivo'."
    typeDescMsgId = 'description_edit_ata'
    allow_discussion = 1


    actions =  (


       {'action': "string:${object_url}/ata_view",
        'category': "object",
        'id': 'view',
        'name': 'View',
        'permissions': ("View",),
        'condition': 'python:1'
       },


       {'action': 'string:${object_url}/folder_localrole_form',
        'category': "object",
        'id': 'sharing',
        'name': 'Sharing',
        'permissions': ("SIGFS: Add Ata",),
        'condition': 'python:1'
       },


    )

    _at_rename_after_creation = True

    schema = Ata_schema

    ##code-section class-header #fill in your manual code here
    ##/code-section class-header

    # Methods

    # Manually created methods

    def getPresente(self):
        """Retorna os convidados presentes na reunião."""
        presentes = []
        nao_presentes = []
        for convidado in self.getConvidados_reuniao():
            if convidado.get('justificou') == 'presente':
                presentes.append(convidado)
            else:
                nao_presentes.append(convidado)
        return [presentes, nao_presentes]

    security.declarePrivate('_renameAfterCreation')
    def _renameAfterCreation(self, check_auto_id=False):
        """Renomeia o objeto com id numérico sequencial de 6 casas decimais."""
	parent_ids = self.aq_inner.aq_parent.objectIds()
        try:
          new_id = 'at'+'%0.4i' % len(parent_ids)
          # Usando o portal_factory tem que comitar a subtransacao
          transaction.savepoint(optimistic=True)
	  self.setId(new_id)
	except:
	  new_id = 'at'+'%0.4i' % len(parent_ids) + str(random.randint(1,1000))
          # Usando o portal_factory tem que comitar a subtransacao
          transaction.savepoint(optimistic=True)
	  self.setId(new_id)

    def getLocal(self):
        """Retorna o Local da Reunião."""
        reuniao = aq_parent(aq_inner(self))
        return reuniao.getLocal()

    def listCargo(self):
        """Lista de cargos dos Convidados"""
        return DisplayList((("convidado", "Convidado",),("substituto", "Substituto",),("assessor", "Assessor Técnico",),))

    def listConvocadosReuniao(self):
        """Retorna a lista de Convocados para a Reunião."""
        portal_membership = getToolByName(self, 'portal_membership')
        reuniao = aq_parent(aq_inner(self))
        convocados = reuniao.getConvocados()
        return [i + ' - ' + portal_membership.getMemberById(i).getProperty('funcao', '') for i in convocados]

    def getNumero(self):
        """Retorna o número da Reunião."""
        reuniao = aq_parent(aq_inner(self))
        return reuniao.Id()

    def getPauta(self):
        """Retorna a pauta da Reunião."""
        reuniao = aq_parent(aq_inner(self))
        return reuniao.getPauta()

    def sendReviewMail(self):
        """Quando a ata é enviada para revisão, envia uma notificação por
        email para os convidados e convocados revisarem a pauta."""
        portal_membership = getToolByName(self, 'portal_membership')
        convidados = [i['nome'] for i in self.getConvidados_reuniao()]
        usuarios = self.listConvocadosPresentes()
        usuarios = usuarios + convidados
        reuniao = self.aq_inner.aq_parent
        contatos = reuniao.getContatos()
        fundo = self.getFundo()

        subject = "Convocação para revisão da ata"
        mailText = self.ata_review_send_mail(self, reuniao=self, contatos=contatos, fundo=fundo)

        for u in usuarios:
            email = portal_membership.getMemberById(u).getProperty('email', '')
            if email: self.sendNotificationEmail(email, subject, mailText)

    def listJustificou(self):
        """Lista de respostas para justificativa ou não"""
        return DisplayList((("presente", "Estava presente",),("sim", "Justificou ausência",),("nao", "Não justificou ausência",),))

    def getData(self):
        """Retorna a data da Reunião."""
        reuniao = aq_parent(aq_inner(self))
        return reuniao.start()

    def getFundo(self):
        """Retorna o Fundo Setorial a que pertence a Ata."""
        reuniao = self.aq_inner.aq_parent
        return reuniao.getFundo()

    def listConvidadosReuniao(self):
        """Retorna a lista de Convidados para a Reunião."""
        reuniao = aq_parent(aq_inner(self))
        vocabulary = []

        for i in reuniao.getConvidados():
            vocabulary.append((i, i))

        return DisplayList(list(vocabulary))

    def listConvocadosPresentes(self):
        """Retorna a lista de Convocados para a Reunião."""
        portal_membership = getToolByName(self, 'portal_membership')
        reuniao = aq_parent(aq_inner(self))
        return reuniao.listConvocados()



registerType(Ata, PROJECTNAME)
# end of class Ata

##code-section module-footer #fill in your manual code here
##/code-section module-footer



